/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package daw.controlador;

import daw.bean.Area;
import daw.bean.Ciudad;
import daw.bean.DelitoSubdelito;
import daw.bean.DelitoSubdelitoPK;
import daw.bean.Denuncia;
import daw.bean.Objeto;
import daw.bean.Subdelito;
import daw.bean.Usuario;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.UserTransaction;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

/**
 *
 * @author Christian
 */
public class ControladorDenuncia extends HttpServlet {
    @PersistenceUnit
    private EntityManagerFactory emf;

    @Resource
    UserTransaction utx;
    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        String operacion = null;
        Hashtable parametros = null;
        if(isMultipart) {
            try {
                operacion = request.getParameter("operacion");
                if(operacion == null){
                    parametros = recuperarParametros(request);
                    operacion = (String) parametros.get("operacion");
                }
            } catch (Exception ex) {
                throw new ServletException(ex.getMessage());
            }
        }else{
            operacion = request.getParameter("operacion");
        }

        if(operacion == null){
            throw new ServletException("No se ha definido valor de operación.");
        }else if(operacion.equals("prepararParaAgregar")){
            EntityManager em = emf.createEntityManager();
            List ciudades = em.createNamedQuery("Ciudad.findAll").getResultList();
            request.setAttribute("ciudades", ciudades);
            List delitos = em.createNamedQuery("Delito.findAll").getResultList();
            request.setAttribute("delitos", delitos);
            em.close();
            Calendar calendario = Calendar.getInstance();
            Date time = calendario.getTime();
            SimpleDateFormat parser = new SimpleDateFormat("dd-MM-yyyy");
            String fechahoy = parser.format(time);
            request.setAttribute("fechahoy", fechahoy);
            //objetos agregados a la denuncia desde otros controladores
            Vector v = (Vector) request.getSession().getAttribute("objetos");
            if (v != null) {
                request.getSession().removeAttribute("objetos");
            }
            Integer n = (Integer)request.getSession().getAttribute("contadorObjetos");
            if(n != null){
                request.getSession().removeAttribute("contadorObjetos");
            }
            //fin de objetos
            getServletContext().getRequestDispatcher("/servicio/protegido/addDenuncia.jsp").forward(request, response);
        }else if(operacion.equals("consultarSubdelitos")){
            EntityManager em = emf.createEntityManager();
            String idDelito = request.getParameter("idDelito");
            List delitossubdelitos = em.createNamedQuery("DelitoSubdelito.findByIdDelito").setParameter("idDelito", Integer.valueOf(idDelito)).getResultList();
            List subdelitos = DelitoSubdelito.DelitoSubdelitoCollectionToSubDelitoCollection(delitossubdelitos);
            String xml = Subdelito.SubdelitoCollectionToXML(subdelitos);
            response.setContentType("text/xml;charset=UTF-8");
            response.getWriter().println(xml);
            em.close();
        }else if(operacion.equals("consultarAreas")){
            EntityManager em = emf.createEntityManager();
            String idCiudad = request.getParameter("idCiudad");
            Ciudad c = (Ciudad)em.createNamedQuery("Ciudad.findByIdCiudad").setParameter("idCiudad", Integer.valueOf(idCiudad)).getSingleResult();
            List areas = c.getAreaCollection();
            String xml = Area.AreaCollectionToXML(areas);
            response.setContentType("text/xml;charset=UTF-8");
            response.getWriter().println(xml);
            em.close();
        }else if(operacion.equals("agregar")){
            String urlfoto_server = null;
            try {
                utx.begin();
                    
                    String fechaDenuncia = (String)parametros.get("fechaDenuncia");
                    String fechaDelito = (String)parametros.get("fechaDelito");
                    String descripcion = (String)parametros.get("descripcion");
                    String delito = (String)parametros.get("delito");
                    String subdelito = (String)parametros.get("subdelito");
                    String direccion = (String)parametros.get("direccion");
                    String ciudad = (String)parametros.get("ciudad");//no c utiliza
                    String area = (String)parametros.get("area");
                    String legal = (String)parametros.get("legal");
                    FileItem filefoto = (FileItem) parametros.get("filefoto");
                    String url_foto = (String) parametros.get("foto");
                    String latitud = (String) parametros.get("latitud");
                    String longitud = (String) parametros.get("longitud");

                    String urlfoto_cliente = null;
                    if(filefoto.getSize() > 0){
                        String filename = FilenameUtils.getName(url_foto);
                        String root = getServletContext().getRealPath("/fotos");
                        urlfoto_server = root + "\\" + filename;
                        urlfoto_cliente = "/fotos/"+filename;
                        File nuevo = new File(urlfoto_server);
                        File parent = nuevo.getParentFile();
                        if (parent != null && !parent.exists()) parent.mkdir();
                        filefoto.write(nuevo);
                    }

                    EntityManager em = emf.createEntityManager();
                    DelitoSubdelito ds = (DelitoSubdelito)em.find(DelitoSubdelito.class, new DelitoSubdelitoPK(Integer.parseInt(delito), Integer.parseInt(subdelito)));
                    Area a = (Area)em.find(Area.class, Integer.parseInt(area));
                    SimpleDateFormat parser = new SimpleDateFormat("dd-MM-yyyy");
                    Date fdelito = parser.parse(fechaDelito);
                    Date fdenuncia = parser.parse(fechaDenuncia);
                    Vector objetos = (Vector)request.getSession().getAttribute("objetos");
                    Usuario u = (Usuario)em.find(Usuario.class, 1);

                    Denuncia d = new Denuncia();
                    d.setArea(a);
                    d.setCoordenada(latitud+","+longitud);
                    d.setDelitoSubdelito(ds);
                    d.setDenunciaLegal(Boolean.parseBoolean(legal));
                    d.setDescripcion(descripcion);
                    d.setDireccion(direccion);
                    d.setFechaDelito(fdelito);
                    d.setFechaDenuncia(fdenuncia);
                    d.setUrlFoto(urlfoto_cliente);
                    d.setUsuario(u);
                    em.persist(d);

                    if(objetos != null){
                        Iterator i = objetos.iterator();
                        while(i.hasNext()){
                            Objeto o = (Objeto)i.next();
                            o.setIdObjeto(null);
                            o.setDenuncia(d);
                            em.persist(o);
                        }
                    }
                utx.commit();
                em.close();

                request.setAttribute("mensaje", "Denuncia registrada con exito.");
                request.getRequestDispatcher("/servicio/ControladorDenuncia?operacion=prepararParaAgregar").forward(request, response);
            } catch (Exception ex) {
                String mensaje = "";
                try { 
                    utx.rollback();
                }catch(Exception ex1){
                    mensaje = ex1.getMessage();
                }finally{
                    if(urlfoto_server != null){
                        File f = new File(urlfoto_server);
                        if(f.exists())
                            f.delete();
                    }
                }

                throw new ServletException(mensaje+"\n"+ex.getMessage());
            }
        }else{
            throw new ServletException("Valor de operación no valido.");
        }
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private Hashtable recuperarParametros(HttpServletRequest request) throws Exception{
        Hashtable parametros = null;
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if(isMultipart){
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(1024*512);
            ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setSizeMax(-1);
            java.util.List items = upload.parseRequest(request);
            java.util.Iterator iter = items.iterator();
            parametros = new Hashtable();
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();
                if(item.isFormField()) {
                    if(item.getFieldName().equals("filefoto"))
                        throw new Exception("No puede existir ningún atributo llamado "+item.getFieldName());
                    parametros.put(item.getFieldName(), item.getString());
                }else {
                    parametros.put("filefoto", item);
                    parametros.put(item.getFieldName(), item.getName());
                }
            }
        }
        return parametros;
    }
}
